package org.i1510.spider.utils.spiderExt.worker;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import org.i1510.common.utils.StringUtils;
import org.i1510.spider.bean.SysSpiderRuleBean;
import org.i1510.spider.utils.spiderExt.fetcher.PageFetcher;
import org.i1510.spider.utils.spiderExt.handler.ContentHandler;
import org.i1510.spider.utils.spiderExt.model.FetchedPage;
import org.i1510.spider.utils.spiderExt.model.SpiderParams;
import org.i1510.spider.utils.spiderExt.queue.SpiderRuleQueue;
import org.i1510.spider.utils.spiderExt.queue.VisitedSpiderRuleQueue;
import org.i1510.spider.utils.spiderExt.router.Html;
import org.i1510.spider.utils.spiderExt.router.HtmlStore;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
/**
 * @author Administrator http://caibaojian.com/c/code 
 *
 */
public class SpiderRuleWorker implements Runnable{
	private static final Logger log = Logger.getLogger(SpiderRuleWorker.class.getName());
	private PageFetcher fetcher;
	private ContentHandler handler;
	private int threadIndex;
	
	public SpiderRuleWorker(int threadIndex){
		this.threadIndex = threadIndex;
		this.fetcher = new PageFetcher();
		this.handler = new ContentHandler();
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {		
		
		// 当待抓取URL队列不为空时，执行爬取任务
		// 注： 当队列内容为空时，也不爬取任务已经结束了
		//     因为有可能是UrlQueue暂时空，其他worker线程还没有将新的URL放入队列
		//	        所以，这里可以做个等待时间，再进行抓取（二次机会）
		while(!SpiderRuleQueue.isEmpty()){
			// 从待抓取队列中拿URL
			SysSpiderRuleBean sysSpiderRuleBean = SpiderRuleQueue.outElement();
			String url = sysSpiderRuleBean.getUrl();
			if(!StringUtils.isStringEmpty(url)){
				// 抓取URL指定的页面，并返回状态码和页面内容构成的FetchedPage对象
				FetchedPage fetchedPage = fetcher.getContentFromUrl(url,sysSpiderRuleBean);
				
				// 检查爬取页面的合法性，爬虫是否被禁止
				if(!handler.check(fetchedPage,sysSpiderRuleBean)){
					// 切换IP等操作					
					log.info("Spider-" + threadIndex + ": switch IP to ");
					continue;
				}
				
				// 解析页面，获取目标数据
				List<Map> list = new ArrayList<Map>();				
				Document doc = Jsoup.parse(fetchedPage.getContent());
				Html html = new Html();
				HtmlStore htmlStore = new HtmlStore();
				//是否爬取成功
				Boolean flag = false;				
				//通过路由判断
				if(sysSpiderRuleBean.getHtmlKey().trim().toLowerCase().equals("job_caibaojian")){
					//http://caibaojian.com/c/code 主表
					list = html.getCBJ(doc);
					if(list.size() > 0){
						flag = htmlStore.saveCBJ(list);
					}else{
						flag = true;
					}
					
				}else if(sysSpiderRuleBean.getHtmlKey().trim().toLowerCase().equals("job_caibaojian_dt")){
					//http://caibaojian.com/c/code 明细
					list = html.getCBJ_dt(doc);
					if(list.size() > 0){
						flag = htmlStore.saveCBJ_dt(list,sysSpiderRuleBean);
					}else{
						flag = true;
					}					
				}else{
					flag = false;
				}
				
				
				// 将URL放入已爬取队列
				if(flag){
					VisitedSpiderRuleQueue.addElement(sysSpiderRuleBean);
				}else{
					SpiderRuleQueue.addFirstElement(sysSpiderRuleBean);
				}
				
				
				
				// delay
				try {
					Thread.sleep(SpiderParams.DEYLAY_TIME);
				} 
				catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
		}
		
		fetcher.close();
		log.info("Spider-" + threadIndex + ": stop...");
	}

}
